package com.xzc.jcip._3_.对象的共享.不变性;

import net.jcip.annotations.Immutable;

import java.math.BigInteger;
import java.util.Arrays;

/**
 * copy_on_write
 * 1-通过将变量设置为不可变，防止其它线程更改
 * 2-如果要更新，则再创建一个容器对象-OneValueCache-lastFactors，这个容器对象是可变的，而且是被
 * 外部所创建的。其内部是不变量。
 * 3-如果要返回容器对象，则使用副本copy一份，这样就不用担心外界修改对象本身
 */
@Immutable
public class OneValueCache {
    private final BigInteger lastNumber;
    private final BigInteger[] lastFactors;

    public OneValueCache(BigInteger i, BigInteger[] factors) {
        lastNumber = i;
        //如果没有copyof那么就是可变的了
        lastFactors = Arrays.copyOf(factors, factors.length);
    }

    public BigInteger[] getFactors(BigInteger i) {
        if (lastNumber == null || !lastNumber.equals(i))
            return null;
        else
            //如果没有copyof那么就是可变的了
            return Arrays.copyOf(lastFactors, lastFactors.length);
    }
}
